package com.qf.test;

/**
 * @author 孙亚梅
 * @version V1.0
 * @Project javase2203
 * @Package com.qf.test
 * @Description:
 * @Date 2022/6/4 21:57
 */

import com.qf.service.FangDongService;
import com.qf.service.FangDongServiceImpl;
import org.junit.Test;
import org.springframework.cglib.proxy.Enhancer;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 测试动态代理
 */
public class TsetDynamicProxy {

    /**
     * 测试jdk底层实现的动态代理功能
     * 基于接口实现的动态代理功能
     */
    @Test
public  void testJDKProxy(){
    //1：创建需要被执行的目标，也就是核心业务对象
     final FangDongService fangDongService = new FangDongServiceImpl();

    //2：创建jdk底层实现的代理对象
    InvocationHandler ih = new InvocationHandler() {

        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
           //3：在代理对象中加入辅助功能相当于加入日志功能，加入事务功能
            System.out.println("======开启事务功能==========");
            System.out.println("======打印日志===========");

            //4：执行核心业务对象的业务方法
            fangDongService.zuFang();

            System.out.println("====提交事务功能=====");

            return null;
        }
    };

    //5：动态生成代理类，实例化执行
    //第一参数：当前类的类加载器，第二参数：被代理接口的字节码，第三参数：代理对象
    FangDongService proxy =(FangDongService) Proxy.newProxyInstance(TsetDynamicProxy.class.getClassLoader(), fangDongService.getClass().getInterfaces(), ih);

    //执行方法
    proxy.zuFang();
}


/**
 * CGLib动态代理（了解）
 */
@Test
public  void  testCGLTB(){
    //目标
    final FangDongService fangDongService = new FangDongServiceImpl();

    //创建字节码增强器，用来给类创建代理
    Enhancer enhancer = new Enhancer();
    //指定被代理类，将被代理类字节码传入
    enhancer.setSuperclass(FangDongServiceImpl.class);
    //实现代理中的额外功能
    enhancer.setCallback(new org.springframework.cglib.proxy.InvocationHandler(){

        public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
            //辅助功能，额外功能
            System.out.println("发布租房信息");
            System.out.println("带租客看房2");
            //核心
            fangDongService.zuFang();

            return  null;
        }
    });

    //动态生成代理类
    FangDongServiceImpl proxy = (FangDongServiceImpl) enhancer.create();

    proxy.zuFang();
}


}
